#ifndef TETRISWINDOW_H
#define TETRISWINDOW_H

#include <QMainWindow>
#include <QBrush>
#include <QPen>
#include <QTimer>
#include <QLabel>
#include <QtCore>
#include "tetris_settings.h"
#include "block.h"
/**
 * 俄罗斯方块游戏
 * @brief The TetrisWindow class
 */
class TetrisWindow : public QMainWindow
{
    Q_OBJECT
public:
    enum GameStatus{RUNNING, STOP, PAUSE}; //游戏状态
    explicit TetrisWindow(QWidget *parent = nullptr);
    virtual~TetrisWindow()override;

    /**
     * 初始化
     * @brief init
     */
    void init();

    /**
     * 初始化菜单
     * @brief initMenu
     */
    void initMenu();

    /**
     * 初始化看板
     * @brief initScoreBoard
     */
    void initScoreBoard();

    /**
     * 开始游戏
     * @brief startGame
     */
    void startGame();

    /**
     * 暂停(继续)游戏
     * @brief pauseGame
     */
    void pauseOrContinueGame();

    /**
     * 游戏结束
     * @brief gameOver
     */
    void gameOver();
    /**
     * 重置(清除)
     * @brief reSetBlocks
     */
    void reSetBlocks();

    /**
     * 将currentBlock方块复制到地图
     * @brief copyBlock
     */
    void copyBlock();

    /**
     * 左移
     * @brief leftMove
     */
    void leftMove();

    /**
     * 右移
     * @brief rightMove
     */
    void rightMove();

    /**
     * 下移
     * @brief downMove
     */
    void downMove();

    /**
     * 检测是否得分
     * @brief checkGetScore
     */
    void checkGetScore();

    /**
     * 第i行删除
     * @brief clearI
     * @param i
     */
    void clearI(int  i);

    /**
     * 变形
     * @brief changeVariant
     */
    void changeVariant();

    /**
     * 重置方块的形状,恢复位置（相当于产生一个新的方块）
     * @brief reSetBlock
     */
    void reSetBlock();

    /**
     * 初始化下一个方块
     * @brief initNextBlock
     */
    void initNextBlock();

    /**
     * 随机获取一种方块类型
     * @brief getRandomType
     */
    Block::BlockType getRandomType();

    /**
     * 随机获取一种变形
     * @brief getRandomSubType
     */
    Block::Variant getRandomSubType();

    /**
     * 计算当前方块(4*4)中第churrentI行是地图中的第几行
     * @brief getCurrentBlocksI
     * @param churrentI 第几行(0-3)
     * @return
     */
    int getCurrentBlocksI(int currentI);
    /**
     * 计算当前方块(4*4)中第churrentJ列是地图中的第几列
     * @brief getCurrentBlocksJ
     * @param currentJ
     * @return
     */
    int getCurrentBlocksJ(int currentJ);

    /**
     * 复写绘制函数
     * @brief paintEvent
     * @param event
     */
    void paintEvent(QPaintEvent *event)override;

    /**
     * 键盘按下事件
     * @brief keyPressEvent
     * @param event
     */
    void keyPressEvent(QKeyEvent *event)override;

    /**
     * 绘制游戏背景
     * @brief drawGb
     * @param painter
     */
    void drawGb(QPainter &painter);

    /**
     * 绘制方块(到达底部的方块)
     * @brief drawBlocks
     * @param painter
     */
    void drawBlocks(QPainter &painter);

    /**
     * 绘制当前在活动的方块
     * @brief drawCurrentBlock
     * @param painter
     */
    void drawCurrentBlock(QPainter &painter);

    /**
     * 绘制下一个方块
     * @brief drawNextBlock
     * @param painter
     */
    void drawNextBlock(QPainter &painter);




signals:

public slots:
    /**
     * 自动下移
     * @brief slotAutoDown
     */
    void slotAutoDown();
    /**
     * 暂停游戏
     * @brief slotPauseGame
     */
    void slotPauseGame();
    /**
     * 开始游戏
     * @brief slotStartGame
     */
    void slotStartGame();
    /**
     * 停止游戏
     * @brief slotStopGame
     */
    void slotStopGame();

    /**
     * 帮助信息
     * @brief slotHelp
     */
    void slotHelp();
private:
    QPen * pen = nullptr; //画笔
    QBrush * brush = nullptr; //画刷
    //二维数组表示地图,为1的位置表示有方块 为0的位置表示没有方块
    int blocks[GAME_HEGIHT/GAME_GRID_SIZE][GAME_WIDTH/GAME_GRID_SIZE]={{0}};
    Block * currentBlock = nullptr; //当前方块
    Block * nextBlock = nullptr; //下一个方块(提示用)
    QTimer * timer;//定时任务自动移动
    int score = 0;//得分
    volatile GameStatus gameStatus = GameStatus::STOP;
    QMenu * menu; //菜单
    QMenu * helpMenu; //帮助菜单
    QAction * startGameAction; //菜单按钮 开始游戏
    QAction * stopGameAction;  //菜单按钮 停止游戏
    QAction * pauseOrContinueGameAction; //菜单按钮 暂停或继续游戏
    QAction * helpAction; //菜单按钮 帮助
    QLabel *  nextBlockLabel; //下个方块 label
    QLabel * scoreLabel;// 得分label
    QLabel * scoreValueLabel; //得分值
    QFont font;//字体
    QPalette pe;//调色板

};

#endif // TETRISWINDOW_H
